﻿//16. 最接近的三数之和
//给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数，使它们的和与 target 最接近。
//返回这三个数的和。
//假定每组输入只存在恰好一个解。


class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target)
    {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int c = INT_MAX;
        for (int i = 0; i < n - 2; i++)
        {
            int x = nums[i];
            int left = i + 1, right = n - 1;
            while (left < right)
            {
                int sum = x + nums[left] + nums[right];
                if (sum == target)
                {
                    return target;
                }
                else if (sum > target)
                {
                    if (abs(c) > abs(sum - target))
                    {
                        c = sum - target;
                    }
                    right--;
                }
                else
                {
                    if (abs(c) > abs(sum - target))
                    {
                        c = sum - target;
                    }
                    left++;
                }
            }
        }
        return c + target;
    }
};